// Map 数据结构
// Map 对象保存键值对，并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
// Map键值对的集合，用来映射两个任意类型数据的对应关系

const obj = {};
obj[1] = 'value'
obj[true] = 'value'
obj[{ a: 1 }] = 'value'
    // Object.keys()获取对象所有键;
    // object对象存入的键会以字符串的形式存入，但是以对象作为键这种形式无法解析成字符串，会返回Object
    // 因此这种Object对象键值赋值是有漏洞的
    // console.log({ a: 1 }.toString()); //[object Object]
    // console.log(Object.keys(obj)); //[ '1', 'true', '[object Object]' ]
    // console.log(obj); //{ '1': 'value', true: 'value', '[object Object]': 'value' }

// es6 采用map来进行对象保存(以键值对形式)

// 1.Map.set(key,value):设置Map对象中键的值。返回该Map对象

const newMap = new Map();

newMap.set('foo', 'foo')
newMap.set('kk', 100)
newMap.set({ aa: "name" }, true)
    //Map(3) { 'foo' => 'foo', 'kk' => 100, { aa: 'name' } => true }
console.log(newMap);
// 2. Map.prototype.get(key):返回键对应的值，如果不存在，则返回undefined。
console.log(newMap.get('kk')); //100
console.log(newMap.get({ aa: 'name' })); //undeined

//3. Map.prototype.has(key)：返回一个布尔值，表示Map实例是否包含键对应的值。
console.log(newMap.has('foo')); //true
// 4. Map.prototype.keys():返回一个新的 Iterator对象， 它按插入顺序包含了Map对象中每个元素的键 。

// 5.Map.prototype.values():返回一个新的Iterator对象，它按插入顺序包含了Map对象中每个元素的值 。

// 6.Map.prototype.forEach(callbackFn[, thisArg]):按插入顺序，为 Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg，它将在每次回调中作为this值。

// 7.Map.prototype.delete(key)

// 8.Map.prototype.clear():移除Map对象的所有键/值对